package com.study.config;


import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.study.job.LikeTask;
import org.quartz.*;
import org.springframework.boot.autoconfigure.quartz.QuartzDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class QuartzConfig {

    private static final String LIKE_TASK_IDENTITY = "LikeTaskQuartz";

    /*
    创建QuartzConfig，
    接着定义JobDetail，JobDetail由JobBuilder构建，同时关联了任务QuartzJob1。
    最后我们需要定义定时调度Trigger，简单实现类SimpleScheduleBuilder用于构建Scheduler，TriggerBuilder则用于构建Trigger，
    这样一个Quartz定时任务就配置完成了。
     */

    @Bean
    /**
     * 加载job
     * 新建job 类用来代理
     */
    public JobDetail quartzDetail() {
        //JobBuilder：关联具体的Job，用于构建JobDetail
        return JobBuilder.newJob(LikeTask.class).withIdentity(LIKE_TASK_IDENTITY).storeDurably().build();
        //.storeDurably() // 即使没有Trigger关联时，也不需要删除该JobDetail
    }

    // 定义调度触发规则， SimpleScheduleBuilder方式
    @Bean
    public Trigger quartzTrigger() {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10)  //设置时间周期单位秒
//                .withIntervalInHours(2)  //两个小时执行一次
//              .withIntervalInMinutes(1)
                .repeatForever();

        //TriggerBuilder：构建Trigger
        return TriggerBuilder.newTrigger().forJob(quartzDetail())
                .withIdentity(LIKE_TASK_IDENTITY)
                .withSchedule(scheduleBuilder)
                .build();
    }

//    //// 定义调度触发规则， CronScheduleBuilder方式
//    @Bean
//    public Trigger cronQuartzTrigger() {
//        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder
//                .cronSchedule("0/20 * * * * ?");  //从0秒开始，每隔20秒触发
//
//        //TriggerBuilder：构建Trigger
//        return TriggerBuilder.newTrigger().forJob(quartzDetail())
//                .withIdentity(LIKE_TASK_IDENTITY)
//                .withSchedule(cronScheduleBuilder)
//                .build();
//    }


    //将定时任务持久化
    //Error:EmbeddedDatabaseType class not found，Druid数据源初始化需要引入spring-jdbc依赖，JPA或mybatis依赖已经包含该依赖
//    @Bean
//    @QuartzDataSource
//    @ConfigurationProperties(prefix = "spring.quartz.properties.org.quartz.datasource")
//    DataSource quartzDataSource(){
//        return DruidDataSourceBuilder.create().build();
//    }
}

/*
在Quartz中的主要概念：

Scheduler：调度任务的主要API
ScheduleBuilder：用于构建Scheduler，例如其简单实现类SimpleScheduleBuilder
Job：调度任务执行的接口，也即定时任务执行的方法
JobDetail：定时任务作业的实例
JobBuilder：关联具体的Job，用于构建JobDetail
Trigger：定义调度执行计划的组件，即定时执行
TriggerBuilder：构建Trigger

 JobDetail定义的是任务数据，而真正的执行逻辑是在Job中。使用JobDetail + Job而不是Job，这是因为任务是有可能并发执行，如果Scheduler直接使用Job，就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式，sheduler每次执行，都会根据JobDetail创建一个新的Job实例，这样就可以规避并发访问的问题。
 */